/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.eupmt.lab3.persistence.ibatis.dao;

import com.eupmt.lab3.domain.Distribuidor;
import com.eupmt.lab3.domain.NotaReparacio;
import com.eupmt.lab3.domain.Producte;
import com.eupmt.lab3.domain.TipusReparacio;
import com.eupmt.lab3.exceptions.NotaReparacioJaExisteixException;
import com.eupmt.lab3.exceptions.NotaReparacioNoExisteixException;
import com.eupmt.lab3.persistence.ibatis.PersistenceManager;
import com.eupmt.lab3.persistence.ibatis.dao.ibator.IbatorNotaReparacioDAOImpl;
import com.eupmt.lab3.utils.Log;
import com.ibatis.sqlmap.client.SqlMapClient;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static com.eupmt.lab3.utils.Constants.*;



    //metodes



public class NotaReparacioDAOImpl extends IbatorNotaReparacioDAOImpl implements NotaReparacioDAO{
    private SqlMapClient sqlMapClient;
    private Log log = null;

    //Constructors
    public NotaReparacioDAOImpl() {
        super();
        sqlMapClient = PersistenceManager.getInstance().getSqlMapClient();
        log = new Log();

    }

    public void saveReparacio(NotaReparacio notaReparacio) throws Exception {
        log.infoLog("notaReparacio a fer save: " + notaReparacio.getIdreparacio());

        if (notaReparacio.getIdreparacio() == UNDEFINED) {
            insertReparacio(notaReparacio);
        } else {
            this.updateReparacio(notaReparacio);
        }
    }

    public void insertReparacio(NotaReparacio notaReparacio) throws Exception {
          try{
              sqlMapClient.insert("notareparacio.insert", notaReparacio);
          }catch (SQLException sqle){
              if (sqle.getErrorCode() == REPARACIO_JA_EXISTEIX) {
                throw new NotaReparacioJaExisteixException();
            }
           log.infoLog("Insert SQLErrorCode:" + sqle.getErrorCode() + ":");
          }

    }

    public void updateReparacio(NotaReparacio notaReparacio) throws Exception {
        sqlMapClient.update("notareparacio.update", notaReparacio);
    }

    public void deleteReparacio(NotaReparacio notaReparacio) throws Exception {
        try {
            sqlMapClient.delete("notareparacio.delete", notaReparacio);
        } catch (SQLException sqle) {
            if (sqle.getErrorCode() == REPARACIO_NO_EXISTEIX) {
                throw new NotaReparacioJaExisteixException();
            }
        }
    }

    public NotaReparacio getNotaReparacioById(int idNotaReparacio) throws Exception {
        NotaReparacio nota=new NotaReparacio();
        nota.setIdreparacio(idNotaReparacio);

        NotaReparacio nota2=null;

        try{
            nota2=(NotaReparacio)sqlMapClient.queryForObject("notareparacio.selectById",nota);

        }catch(SQLException sqle){
            if (sqle.getErrorCode() == REPARACIO_NO_EXISTEIX) {
                throw new NotaReparacioNoExisteixException(sqle.getMessage());
            }
        }
        return nota2;

    }

    public List<NotaReparacio> getNotesReparacioByDistribuidor(int IdDistribuidor) throws Exception {
        List<NotaReparacio> llista= new ArrayList<NotaReparacio>();
        Distribuidor d=new Distribuidor();
        d.setIddistribuidor(IdDistribuidor);
        try{
            llista=(List<NotaReparacio>)sqlMapClient.queryForList("notareparacio.selectByDistribuidor",d);
        }catch(SQLException sqle){
             if (sqle.getErrorCode() == REPARACIO_NO_EXISTEIX) {
                throw new NotaReparacioNoExisteixException(sqle.getMessage());
            }

        }
        return llista;
        
       
    }

    public List<NotaReparacio> getNotesReparacioByProducte(int idProducte) throws Exception {
        List<NotaReparacio> llista= new ArrayList<NotaReparacio>();
        Producte p=new Producte();
        p.setIdproducte(idProducte);
        try{
            llista=(List<NotaReparacio>)sqlMapClient.queryForList("notareparacio.selectByProducte",p);
        }catch(SQLException sqle){
             if (sqle.getErrorCode() == REPARACIO_NO_EXISTEIX) {
                throw new NotaReparacioNoExisteixException(sqle.getMessage());
            }

        }
        return llista;
    }

    public List<NotaReparacio> getNotesReparacioByTipusReparacio(int idTipusReparacio) throws Exception {
        List<NotaReparacio> llista= new ArrayList<NotaReparacio>();
        NotaReparacio nota=new NotaReparacio();
        nota.setIdtipusreparacio(idTipusReparacio);
        try{
            llista=(List<NotaReparacio>)sqlMapClient.queryForList("notareparacio.selectByTipusReparacio",nota);
        }catch(SQLException sqle){
             if (sqle.getErrorCode() == REPARACIO_NO_EXISTEIX) {
                throw new NotaReparacioNoExisteixException(sqle.getMessage());
            }

        }
        return llista;
    }

    public List<NotaReparacio> getNotesReparacioBetweenDates(Date dataInici, Date dataFi) throws Exception {
        List<NotaReparacio> llista= new ArrayList<NotaReparacio>();
       NotaReparacio nota=new NotaReparacio();
       nota.setDatarecepcio(dataInici);
       nota.setDatareparacio(dataFi);

        try{
            llista=(List<NotaReparacio>)sqlMapClient.queryForList("notareparacio.selectByBetweenDatesReparacio",nota);
        }catch(SQLException sqle){
             if (sqle.getErrorCode() == REPARACIO_NO_EXISTEIX) {
                throw new NotaReparacioNoExisteixException(sqle.getMessage());
            }

        }
        return llista;
    }

    
    }

